package fr.miage.orleans.aar.inscription;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.google.gson.Gson;

import fr.miage.orleans.aar.ejb.FacadeBean;
import fr.miage.orleans.aar.ejb.FacadeGettersBean;
import fr.miage.orleans.aar.ejb.FacadeGettersVoBean;
import fr.miage.orleans.aar.modele.Equipe;
import fr.miage.orleans.aar.modele.Joueur;
import fr.miage.orleans.aar.modele.PosteJoueur;
import fr.miage.orleans.aar.modele.Tournoi;
import fr.miage.orleans.aar.modele.valueobject.ValueObjectTournoi;

/**
 * Servlet implementation class InscriptionServlet
 */
@WebServlet(name = "/InscriptionServlet", urlPatterns = { "/inscription" })
public class InscriptionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private static final String STRING_ACTION = "action";

	@EJB
	private FacadeBean facade;
	@EJB
	private FacadeGettersBean facadeGetters;
	@EJB
	private FacadeGettersVoBean facadeGettersVo;

	private static final String SA_TOURNOIS = "tournois";
	private static final String SA_VOTOURNOI = "votournoi";


	private static final String JSP_CONSULTATION = "/WEB-INF/consultation.jsp";
	private static final String JSP_DETAIL_TOURNOI = "/WEB-INF/consultation_detail_tournoi.jsp";
	private static final String JSP_INSCRIPTION = "/WEB-INF/inscriptiontournoi.jsp";
	/**
	 * Les actions
	 */
	private static final String ACTION_INSCRIRE_EQUIPE_TOURNOI = "inscriptionEquipe";
	private static final String ACTION_CREER_INSCRIRE_EQUIPE_TOURNOI = "create";
	private static final String ACTION_GET_DETAIL_EQUIPE = "getDetailEquipe";

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public InscriptionServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

	protected void processIndex(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession(true);
		if(session.getAttribute("idTournoi") != null && ! session.getAttribute("idTournoi").equals(""))
		{
			String idtournoi = (String) session.getAttribute("idTournoi");
			Tournoi t = facadeGetters.getTournoiById(Integer.valueOf(idtournoi));
			//TODO if encours etc...
			Collection<Equipe> equipesNonInscrites = facadeGetters.getEquipesNonInscrites(t.getTournoiId());
			Collection<PosteJoueur> postes = facadeGetters.getPostesJoueurs();

			session.setAttribute("EquipesNonInscrites", equipesNonInscrites);
			session.setAttribute("nomTournoi", t.getNomTournoi());
			session.setAttribute("idTournoi", t.getTournoiId());
			session.setAttribute("PostesJoueurs", postes);		
			request.getRequestDispatcher(JSP_INSCRIPTION).forward(request, response);
		}
		else
		{
			Collection<Tournoi> tournois = facadeGetters.getAllTournois();
			session.setAttribute(SA_TOURNOIS, tournois);
			request.getRequestDispatcher(JSP_CONSULTATION).forward(request, response);
		}
	}

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");

		String action = request.getParameter(STRING_ACTION);
		if (action == null || action.isEmpty()) {
			this.processIndex(request, response);
		} else {
			switch (action) {
			case ACTION_GET_DETAIL_EQUIPE: {
				this.processGetDetailEquipe(request, response);
				break;
			}
			case ACTION_INSCRIRE_EQUIPE_TOURNOI: {
				this.processInscriptionEquipeTournoi(request, response);
				break;
			}
			case ACTION_CREER_INSCRIRE_EQUIPE_TOURNOI : 
			{
				this.processCreationInscription(request,response);
				break;
			}
			default: {
				this.processIndex(request, response);
			}
			}
		}
	}


	protected void processInscriptionEquipeTournoi(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		String paramIdTournoi = request.getParameter("tournoiId");
		int tournoiId = Integer.parseInt(paramIdTournoi);
		String paramIdEquipe = request.getParameter("idEquipe");
		int equipeId = Integer.parseInt(paramIdEquipe);
		facade.inscriptionTournoi(equipeId, tournoiId);
		
		HttpSession session = request.getSession(true);
		session.setAttribute("tournoiId", tournoiId);
		ValueObjectTournoi vot = facadeGettersVo.getVoTournoi(tournoiId);
		session.setAttribute(SA_VOTOURNOI, vot);
		
		request.getRequestDispatcher(JSP_DETAIL_TOURNOI).forward(request, response);
	}


	protected void processGetDetailEquipe(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		response.setContentType("application/json");
		int equipeId = Integer.parseInt(request.getParameter("idEquipe"));
		Collection<Joueur> joueurs = facadeGetters
				.getJoueursEquipe(equipeId);
		PrintWriter out = response.getWriter();
		Gson gson = new Gson();
		out.print(gson.toJson(joueurs));
		out.flush();
	}

	protected void processCreationInscription(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String paramidTournoi = request.getParameter("tournoiId");
		int tournoiId = Integer.parseInt(paramidTournoi);
		String nomEquipe = request.getParameter("EquipeName");
		Equipe e = this.facade.createEquipe(nomEquipe);

		//Creer les joueurs
		for(int i = 0 ; i < 15 ; ++i)
		{

			if(request.getParameter("nom"+i) != null && !request.getParameter("nom"+i).equals("")
				&& request.getParameter("prenom"+i) != null && !request.getParameter("prenom"+i).equals("")
				&& request.getParameter("poste"+i) != null && !request.getParameter("poste"+i).equals(""))
			{
				//Le joueur existe et tout ses attributs sont set

				String nom = request.getParameter("nom"+i);
				String prenom = request.getParameter("prenom"+i);
				String posteJoueurId = request.getParameter("poste"+i);
				PosteJoueur posteJoueur = facadeGetters.getPosteJoueurById(Integer.parseInt(posteJoueurId));
				Joueur j = this.facade.createJoueur(nom, prenom, posteJoueur);
				this.facade.addJoueurToEquipe(e.getEquipeId(), j.getPersonneId());
			}
		}
		this.facade.inscriptionTournoi(e.getEquipeId(), tournoiId);
		HttpSession session = request.getSession(true);
		session.setAttribute("tournoiId", tournoiId);
		ValueObjectTournoi vot = facadeGettersVo.getVoTournoi(tournoiId);
		session.setAttribute(SA_VOTOURNOI, vot);
		request.getRequestDispatcher(JSP_DETAIL_TOURNOI).forward(request, response);
	}
}
